//axios错误处理
// 1.网络错误提示 error.response === undefined
// 2.非用户认证提示
// 3。用户认证错误处理

import store from '@/store'
import { Auth } from '@/store/reducers/user'
import { Toast } from 'antd-mobile'
import axios from 'axios'
import history from './history'
import { getTokenInfo, setTokenInfo, removeTokenInfo } from './storage'

// 请求基地址
export const baseURL = 'http://geek.itheima.net'

// 创建 axios 实例
const http = axios.create({
  baseURL: baseURL,
  timeout: 5000,
})

// 请求拦截器
http.interceptors.request.use(
  function (config: any) {
    const { token } = getTokenInfo()
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    return Promise.reject(error)
  }
)

// 响应拦截器
http.interceptors.response.use(
  function (response) {
    return response.data
  },
  async function (error) {
    // 如果回应是个undefined说明没有网络
    if (!error.response) {
      Toast.show({ content: '网络开小差拉，请重试...' })
    } else if (error.response.status !== 401) {
      // 错误情况2：非用户认证错误提示，有网络，但是进行了错误操作（如：一分钟内重复获取验证码，验证码错误 等...）
      Toast.show({ content: error.response.data.message })
    } else {
      // 错误情况3：用户认证错误处理：token超时或者未传token 通过refresh—_token来获取新的token
      console.log('用户认证错误处理')
      const { refresh_token } = getTokenInfo()
      if (refresh_token) {
        try {
          //无感刷新token
          const res = await axios({
            url: baseURL + `/v1_0/authorizations`,
            method: 'PUT',
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded',
              Authorization: `Bearer ` + refresh_token,
            },
          })
          //新的token
          const newToken = res.data.data.token

          const auth: Auth = { token: newToken, refresh_token: refresh_token }
          //存储到本地
          setTokenInfo(auth)
          //存储到redux
          console.log(store)
          store.dispatch({ type: 'user/saveAuth', payload: auth })
          //获取错误请求的config
          console.log('请求错误时的config', error.config)
          //根据原来的信息，发送一次新的请求
          console.log(75, http(error.config))
          // debugger
          return http(error.config)
        } catch (error) {
          console.log('出错原因')
          console.dir(error)
          //提示用户
          Toast.show({ content: '登录信息过期，请重新登录' })
          //清空redux 和本地存储的token
          removeTokenInfo()
          store.dispatch({ type: 'user/clearAuth' })
          //跳转登录页
          history.push('/login', { from: history.location.pathname })
        }
      }
    }
    return Promise.reject(error)
  }
)

// 导出 axios 实例
export default http
